package com.storm.lib.util;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.storm.lib.vo.IdNumberVo;


import javassist.bytecode.Mnemonic;



/**
 *
 * 类功能:数组工具类
 * @author johnny
 * @version 2010-11-21
 */
public class ArrayUtil {

	/**
	 *
	 * 更新时间:2010-11-21, 作者:johnny
	 * 方法功能:返回长度为0的数组
	 * @param class1
	 * @return
	 */
	public static Object getEmptyArray(Class clazz) {
		return Array.newInstance(clazz, 0) ;
	}

	/**
	 * 方法功能:获得随机Double
	 * 更新时间:2010-12-7, 作者:johnny
	 * @param vars
	 * @return
	 */
	public static Double getRandomDoubleArray(Double[] vars) {
		return vars[IntUtil.getRandomInt(0, vars.length-1)];
	}

	/**
	 * 方法功能:获得随机String
	 * 更新时间:2010-12-7, 作者:johnny
	 * @param vars
	 * @return
	 */
	public static String getRandomStringArray(String[] vars) {
		return vars[IntUtil.getRandomInt(0, vars.length-1)];
	}

	/**
	 * 方法功能:打印出Array
	 * 更新时间:2010-12-9, 作者:johnny
	 * @param heroVos
	 */
	public static void printArray(Object[] objs) {
		for (int i = 0; i < objs.length; i++) {
			ObjectUtil.printObject(objs[i]);
		}

	}

	/**
	 * 方法功能:int 是否在Array
	 * 更新时间:2010-12-21, 作者:johnny
	 * @param i
	 * @param vars
	 * @return
	 */
	public static boolean intInArray(int i, List<Integer> vars) {
		if(vars==null){
			ExceptionUtil.throwInvalidParamException();
		}
		for (int j = 0; j < vars.size(); j++) {
			if(i==vars.get(j).intValue()){
				return true;
			}
		}
		return false;
	}

	/**
	 * 方法功能:String 是否在Array
	 * @param str
	 * @param vars
	 * @return
	 */
	public static boolean strInArray(String str, String[] vars) {
		if(str==null || vars==null){
			return false;
		}
		for (int j = 0; j < vars.length; j++) {
			if(vars[j]!=null && str.equals(vars[j])){
				return true;
			}
		}
		return false;
	}

	/**
	 * 方法功能:int 是否在Array
	 * 更新时间:2010-12-21, 作者:johnny
	 * @param i
	 * @param bossIndexs
	 * @return
	 */
	public static boolean intInArray(int i, int[] bossIndexs) {
		if(bossIndexs==null){
			ExceptionUtil.throwInvalidParamException();
		}
		for (int j = 0; j < bossIndexs.length; j++) {
			if(i==bossIndexs[j]){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 方法功能:删除Int值,
	 * 更新时间:2011-2-9, 作者:johnny
	 * @param list
	 * @param id
	 */
	public static void removeFirstIntegerFromArrayList(List<Integer> list,Integer value) {
		for (int i = 0; i < list.size(); i++) {
			if(list.get(i).intValue()==value){
				list.remove(i);
				return;
			}
		}
	}

	/**
	 * 方法功能:获得IntArray
	 * 更新时间:2011-2-13, 作者:johnny
	 * @param _ids
	 * @return
	 */
	public static Integer[] getIntegerArray(Object[] objs) {
		Integer[] ints =new Integer[objs.length];
		for (int i = 0; i < ints.length; i++) {
			ints[i]=(Integer) objs[i];
		}
		return ints;
	}

	/**
	 * 方法功能:获得IntArray
	 * 更新时间:2011-2-13, 作者:johnny
	 * @param _ids
	 * @return
	 */
	public static int[] getIntArray(Object[] objs) {
		int[] ints =new int[objs.length];
		for (int i = 0; i < ints.length; i++) {
			ints[i]=(Integer) objs[i];
		}
		return ints;
	}

	/**
	 * 方法功能:加前后缀
	 * 更新时间:2011-2-22, 作者:johnny
	 * @param string
	 * @return
	 */
	public static String[] addEachStringPrefix(String[] items,String prefix) {
		for (int i = 0; i < items.length; i++) {
			items[i]=prefix + items[i]+prefix;
		}
		return items;
	}

	/**
	 * 方法功能:获得字符串
	 * 更新时间:2011-2-22, 作者:johnny
	 * @param string
	 * @param string2
	 * @param spliter
	 * @param uids
	 * @return
	 */
	public static String getArrayStr(String startStr, String endStr,String spliter,String[] strs) {
		return startStr+StringUtil.implode(strs,spliter)+endStr;
	}

	/**
	 * 方法功能:
	 * 更新时间:2011-3-10, 作者:johnny
	 * @param lifeKills
	 * @param string
	 * @return
	 */
	public static String getIntArrayStr(List<Integer> intsArray, String delim) {
		int[] ints = getIntegerArray(intsArray);
		return StringUtil.implode(ints, delim);
	}

	/**
	 * 方法功能:
	 * 更新时间:2011-3-10, 作者:johnny
	 * @param lifeKills
	 * @return
	 */
	public static int[] getIntegerArray(List<Integer> list) {
		int[] integerArray =new int[list.size()];
		for (int i = 0; i < list.size(); i++) {
			integerArray[i]=list.get(i);
		}
		return integerArray;
	}

	/**
	 * 冒泡排序
	 * @param ints
	 * @return
	 */
	public static int[] bubbleSort(int[] ints){
		int tmp;
		boolean flag = true;
		for (int i = 0; i < ints.length-1; i++) {
			for (int j = 0; j < ints.length - i - 1; j++) {
		    if (ints[j] > ints[j + 1]) {
		    	tmp = ints[j + 1];
		    	ints[j + 1] = ints[j];
		    	ints[j] = tmp;
		    	flag = false;
		     	}
		    }
		    if (flag){break;}
		    else{flag = true;}
		}
		return ints;
	}

	/**
	 * 找出一个INT数组中最小元素的下标
	 * @param ints
	 * @return
	 */
	public static int[] getArrayMinIndex(int[] ints){
		int min = ints[0];
		for(int i=0; i<ints.length; i++){
			int tmp = ints[i];
			if(min>tmp){
				min = tmp;
			}
		}
		List<Integer> list = new ArrayList<Integer>();
		for(int i=0; i<ints.length; i++){
			int tmp = ints[i];
			if(min==tmp){
				list.add(i);
			}
		}
		int[] indexs = new int[list.size()];
		for(int i=0; i<list.size(); i++){
			indexs[i] = list.get(i);
		}
		return indexs;
	}

	public static void addToNoneNullDuplicateList(String str,List<String> strings) {
		for (int i = 0; i < strings.size(); i++) {
			if(strings.get(i).equals(str)){
				return;
			}
		}
		strings.add(str);
	}
	
	public static int[] toIntArray(List<Integer> list) {
		int[] ints = new int[list.size()];
		for(int i=0; i<list.size(); i++){
			ints[i] = list.get(i);
		}
		return ints;
	}
	
	/**
	 * 方法功能:得到一个指定范围内没有重复值的数组
	 * 更新时间:2011-8-7, 作者:future
	 * @param maxNum 最大值
	 * @param length 长度
	 * @return
	 */
	public static Integer[] getArrayNoRepeat(int maxNum, int length) {
		Integer[] ints = new Integer[length];
		List<Integer> list = new ArrayList<Integer>();
		while(true){
			int random = IntUtil.getRandomInt(0, maxNum);
			if(list.size()>=length){
				break;
			}
			boolean bool = true;
			for(int i=0; i<list.size(); i++){
				if(random==list.get(i)){
					bool = false;
					break;
				}
			}
			if(bool){
				list.add(random);
			}
		}
		ints = list.toArray(ints);
		return ints;
	}
	/**
	 * 奖int数组转换成Integer数组
	 * @param ints
	 * @return
	 */
	public static Integer[] getIntegerArray(int[] ints) {
		Integer[] array = new Integer[ints.length];
		for(int i=0; i<ints.length; i++){
			array[i] = Integer.valueOf(ints[i]);
		}
		return array;
	}
	/**
	 * 在一个非负int数组中添加一个
	 * @param i
	 * @param ints
	 * @return
	 */
	public static void addToArray(int i, int[] ints) {
		for(int j=0; j<ints.length; j++){
			if(ints[j]==0){
				ints[j] = i;
				break;
			}
		}
	}
	/**
	 * 从int数组中移除一个指定值(将其值设为0)
	 * @param i
	 * @param ints
	 */
	public static void removeIntegerFromArray(int i,int[] ints) {
		for(int j=0; j<ints.length; j++){
			if(i==ints[j]){
				ints[j] = 0;
				break;
			}
		}
	}
	/**
	 * 替换int数据中的某个值(如果数组中有重复值,只会替换第一个出现的值)
	 * @param ints
	 * @param i
	 * @param j
	 */
	public static void replaceIntegerFromArray(int[] ints, int i,int j) {
		for(int k=0; k<ints.length; k++){
			if(ints[k]==i){
				ints[k]=j;
				break;
			}
		}
	}
	
	/**
	 * 方法功能:从一个数组中随机取出指定个值
	 * 更新时间:2011-8-7, 作者:future
	 * @param ints
	 * @param length
	 * @return
	 */
	public static Integer[] getRandomArray(Integer[] ints, int length){
		Integer[] indexs = getArrayNoRepeat(ints.length-1, length);
		Integer[] tmps = new Integer[indexs.length];
		for(int i=0; i<tmps.length; i++){
			int index = indexs[i];
			tmps[i] = ints[index];
		}
		return tmps;
	}
	
	public static int getMinNum(List<Double> list){
		double min = list.get(0);
		for(int i=0; i<list.size(); i++){
			double tmp = list.get(i);
			if(tmp<min){
				min = tmp;
			}
		}
		return (int)min;
	}
	
	/**
	 * 方法功能:得到一个随机数组(数组元素的值不会大于length)
	 * 更新时间:2011-8-7, 作者:future
	 * @param max 元素最大值
	 * @param length 数组长度
	 * @return
	 */
//	public static Integer[] getRandomArray(int max, int length){
//		Integer[] ints = new Integer[length];
//		for(int i=0; i<ints.length; i++){
//			int random = IntUtil.getRandomInt(0, max-1);
//			ints[i] = random;
//			max--;
//		}
//		return ints;
//	}
	
	public static int getSum(int[] vals,int count){
		int result = 0;
		for(int i=0;i<count;i++){
			result +=vals[i]; 
		}
		return result;
	}
}
